home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Delphi Informant Complete 1995 - 2000
/
Delphi Informant Complete 1995 to 2000.iso
/
Delphi Informant Magazine Complete Works SOURCE CODE 1998.rar
/
1998
/
May
/
di9805fn
/
StrTst01.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1998-01-13
|
10KB
|
332 lines
unit StrTst01;
{ Related to my File|New Column on AnsiStrings in Delphi Informant, May, 1998.
This project demonstrates routines in the HyperString library from
EFD Systems. To download the free Delphi 3 *.dcu (HSTR.ZIP) needed
to run this program, visit their Web Site at www.mindspring.com/~efd.
Also, be sure to read the paper on AnsiStrings while you're there.
To report bugs or make suggestions, please E-Mail me at acmdoc@aol.com.
(One of the areas that definately could be enhanced here is the relationship
between to new string and the memo that displays the parsed file.)
Thanks, and enjoy! Alan C. Moore }
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
{Utility types, procedures and functions}
type
{This record and the two routines which follow are based on code posted
on the COBB/ZD DDJ-Thread by Ralph Friedman of Herrsching, Germany}
TMemoInfo = record
AbsOffset: integer;
Line: integer;
Col: integer;
end;
type
TForm1 = class(TForm)
StartParseBtn: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
StatusBar1: TStatusBar;
FindPositionBtn: TButton;
FindWordBtn: TButton;
Label1: TLabel;
WordEdit: TEdit;
Label2: TLabel;
PosEdit: TEdit;
NextOfSameWordBtn: TButton;
NextWordBtn: TButton;
PreviousWordBtn: TButton;
SetTagDelimsBtn: TButton;
GetTaggedPhraseBtn: TButton;
GetNextTaggedPhraseBtn: TButton;
Label3: TLabel;
LoadFileBtn: TButton;
procedure StartParseBtnClick(Sender: TObject);
procedure FindPositionBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FindWordBtnClick(Sender: TObject);
procedure NextOfSameWordBtnClick(Sender: TObject);
procedure NextWordBtnClick(Sender: TObject);
procedure PreviousWordBtnClick(Sender: TObject);
procedure Memo1DblClick(Sender: TObject);
procedure GetTaggedPhraseBtnClick(Sender: TObject);
procedure SetTagDelimsBtnClick(Sender: TObject);
procedure GetNextTaggedPhraseBtnClick(Sender: TObject);
procedure LoadFileBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ALongString : string; { Current String being parsed }
AParsedString : string; { string to match memo structure }
NextSubSring : string; { SubString starting at current location }
TokenPos,
TokenCount,
WordCount : integer;
FileIsOpen,
NumberEntered,
WordEntered : boolean;
StartingDelimiter,
EndingDelimiter : string;
procedure GetMemoPos(AMemo: TMemo; var AMemoInfo: TMemoInfo);
procedure SetMemoPos(AMemo: TMemo; var AMemoInfo: TMemoInfo);
procedure FindMemoPos(AMemo: TMemo; OffsetIn : integer;
var AMemoInfo: TMemoInfo);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses HyperStr, SetDelim;
procedure TForm1.GetMemoPos(AMemo: TMemo; var AMemoInfo: TMemoInfo);
begin
with AMemo, AMemoInfo do begin
AbsOffset := SelStart; { Offset of cursor in memo }
Line := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0);
{ Line number of line containing cursor. }
Col := SelStart - SendMessage(Handle, EM_LINEINDEX, Line, 0);
{ Offset of cursor in line. }
end;
end;
procedure TForm1.FindMemoPos(AMemo: TMemo; OffsetIn : integer;
var AMemoInfo: TMemoInfo);
begin
with AMemo, AMemoInfo do begin
SelStart := OffsetIn;
{ First move curser to current location found }
AbsOffset := SelStart; { Offset of cursor in memo }
Line := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0);
{ Line number of line containing cursor. }
Col := SelStart - SendMessage(Handle, EM_LINEINDEX, Line, 0);
{ Offset of cursor in line. }
end;
end;
procedure TForm1.SetMemoPos(AMemo: TMemo; var AMemoInfo: TMemoInfo);
{ Set cursor position in AMemo to that specified in AMemoInfo }
begin
with AMemo, AMemoInfo do
begin
SelStart := AbsOffset;
SelLength := Length(WordEdit.Text);
SendMessage(Handle, EM_SETSEL, SelStart, SelLength);
end;
end;
procedure TForm1.StartParseBtnClick(Sender: TObject);var
AIndex : integer;
TableOfDelims,
TempString : string;
begin
AIndex := 1;
TokenCount := 0;
TokenPos := 1;
if NOT FileIsOpen then exit
else
begin
AParsedString := '';
TableOfDelims := #9#10#13#32#44#46#59;//common delimiters in freeform text
Form1.Repaint;
// first process first word
TempString := ParseWord(ALongString,TableOfDelims,AIndex);
AParsedString := TempString;
Memo1.Lines.Add(TempString);
// now process the other words
repeat
TempString := ParseWord(ALongString,TableOfDelims,AIndex);
AParsedString := Concat(AParsedString, ' ', TempString);
Memo1.Lines.Add(TempString);
until ((AIndex>Length(ALongString)) or (AIndex<1));
WordCount := CountW(AParsedString, TableOfDelims); {uses multiple delimiters}
if SetDelimiter(' ') then {Default Delimiter is a ' '}
TokenCount := GetTokenCnt(AParsedString);
StatusBar1.Panels[0].Text := IntToStr(WordCount)+ ' words found.';
StatusBar1.Panels[1].Text := IntToStr(TokenCount) + ' tokens found.';
FileIsOpen := True;
end;
end;
procedure TForm1.FindPositionBtnClick(Sender: TObject);
begin
if NOT FileIsOpen then
begin
MessageDlg('No File Open', mtError, [mbOK], 0);
Exit;
end;
if (WordEdit.Text='') then
begin
MessageDlg('No Word Entered', mtError, [mbOK], 0);
Exit;
end;
TokenPos := Pos(WordEdit.Text, AParsedString);
PosEdit.Text := IntToStr(TokenPos);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FileIsOpen := False;
NumberEntered := False;
WordEntered := False;
StartingDelimiter := '<';
EndingDelimiter := '>';
end;
procedure TForm1.FindWordBtnClick(Sender: TObject);
begin
if NOT FileIsOpen then
begin
MessageDlg('No File Open', mtError, [mbOK], 0);
Exit;
end;
if (PosEdit.Text='') then
begin
MessageDlg('No Position Entered', mtError, [mbOK], 0);
Exit;
end;
WordEdit.Text := GetToken(AParsedString, StrToInt(PosEdit.Text));
end;
procedure TForm1.NextOfSameWordBtnClick(Sender: TObject);
var
TempPos : integer;
AMemoInfo : TMemoInfo;
TokenNum : integer;
begin
GetMemoPos(Memo1, AMemoInfo);
TempPos := TokenPos + Length(WordEdit.Text) + 2;
NextSubSring := Copy(AParsedString, TempPos,
Length(AParsedString)- TempPos);
if NOT NextToken(NextSubSring, TokenPos) then
begin
MessageDlg('No More Entries Found', mtError, [mbOK], 0);
Exit;
end;
TokenPos := Pos((' '+WordEdit.Text), NextSubSring);
if TokenPos=0 then
begin
MessageDlg('No More Entries Found', mtError, [mbOK], 0);
Exit;
end;
TokenPos := TokenPos + Length(AParsedString)-Length(NextSubSring)+1;
PosEdit.Text := IntToStr(TokenPos);
TokenNum := GetTokenNum(AParsedString, TokenPos);
AMemoInfo.Line := TokenNum-1;
AMemoInfo.Col := 0;
AMemoInfo.AbsOffset := TokenPos-1;
SetMemoPos(Memo1, AMemoInfo);
end;
procedure TForm1.NextWordBtnClick(Sender: TObject);
var
AMemoInfo : TMemoInfo;
TokenNum : integer;
begin
if NOT NextToken(AParsedString, TokenPos) then Exit;
NextToken(AParsedString, TokenPos);
PosEdit.Text := IntToStr(TokenPos);
WordEdit.Text := GetToken(AParsedString, TokenPos);
TokenNum := GetTokenNum(AParsedString, TokenPos);
AMemoInfo.Line := TokenNum-1;
AMemoInfo.Col := 0;
AMemoInfo.AbsOffset := TokenPos-1;
SetMemoPos(Memo1, AMemoInfo);
end;
procedure TForm1.PreviousWordBtnClick(Sender: TObject);
var
AMemoInfo : TMemoInfo;
begin
if NOT PrevToken(AParsedString, TokenPos) then Exit;
PrevToken(AParsedString, TokenPos);
PosEdit.Text := IntToStr(TokenPos);
WordEdit.